﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using JihankiLib;

namespace ConsoleJihanki
{
    class ConsoleMoneyBox : MoneyBoxMachine
    {
        //Todo: UpperLimitOverイベントが関わる機能の実装
        //Todo: LowerLimitOverイベントが関わる機能の実装
        //Todo: EmptyMoneyイベントが関わる機能の実装


        public override void OnNext(JihankiMessage value)
        {
            //Todo: 各MessageProcesserクラスを作成し、そこにメッセージごとの処理を移動する。

            if (value.GetType() == typeof(RunMessage))
                MessageLoop();
            if (value.GetType() == typeof(ItemPurchasedMessage))
                ItemPurchasedProc((ItemPurchasedMessage)value);

        }

        private void ItemPurchasedProc(ItemPurchasedMessage msg)
        {
            var oturi = total.Value - msg.Money.Value;
            total.Clear();
            if(oturi > 1)
                Console.WriteLine("商品が購入されました。お釣りを返却します。:{0}", oturi);
        }

        private void MessageLoop()
        {
            while (true)
            {
                LoopProc();
            }
        }

        private void LoopProc()
        {    
            Console.Write("自販機です。入金して商品を購入してください。(-1で入金分の排出) ：");

            var cmd = Console.ReadLine();
            int money;
            if (!int.TryParse(cmd, out money))
                return;
            
            if (money == -1)
            {
                Console.WriteLine("お金が排出されました。:{0}", total.Value);
                RejectAllMoney();
            }

            AddMoney(money);
        }

        public override void AddMoney(int money)
        {
            var added = MoneyParser.Current.Parse(money);
            total = MoneyParser.Current.Parse(added.Value + total.Value);
            var hasuu = money - added.Value;
            if (hasuu > 0)
                Console.WriteLine("端数金額を返却します。:{0}", hasuu);
            OnAddedMoney(added, total);
        }
    }
}
